package main

import (
	"fmt"
	"sync"
)

type Sequence[E any] struct {
	// 切片类型，用于存储队列元素
	elements []E

	// 锁对象，用于多协程同步处理
	lock sync.Mutex
}

func (seq *Sequence[E]) Push(element E) {
	// 执行锁定，防止多协程同时操作
	seq.lock.Lock()
	// 保证解锁
	defer seq.lock.Unlock()

	// 队列切片中追加新的元素
	seq.elements = append(seq.elements, element)
}

func (seq *Sequence[E]) Pop() E {
	// 执行锁定，防止多协程同时操作
	seq.lock.Lock()
	// 保证解锁
	defer seq.lock.Unlock()

	var result E
	if len(seq.elements) == 0 {
		return result
	}

	// 获得切片中第一个元素
	result = seq.elements[0]
	// 截取切片的1~结尾位置的所有元素，并赋值给队列
	seq.elements = seq.elements[1:]
	return result
}

func main6() {
	seq1 := &Sequence[string]{}
	seq1.Push("A")
	fmt.Println(seq1.Pop())

	seq2 := &Sequence[int]{}
	seq2.Push(10)
	fmt.Println(seq2.Pop())
}
